package com.zjsru.leetcode75.level1;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author: cookLee
 * @Date: 2023-10-06
 */
public class FindDifference {

    /**
     * 主
     * \
     * 输入：nums1 = [1,2,3], nums2 = [2,4,6]
     * 输出：[[1,3],[4,6]]
     * 解释：
     * 对于 nums1 ，nums1[1] = 2 出现在 nums2 中下标 0 处，然而 nums1[0] = 1 和 nums1[2] = 3 没有出现在 nums2 中。因此，answer[0] = [1,3]。
     * 对于 nums2 ，nums2[0] = 2 出现在 nums1 中下标 1 处，然而 nums2[1] = 4 和 nums2[2] = 6 没有出现在 nums2 中。因此，answer[1] = [4,6]。
     * \
     * 输入：nums1 = [1,2,3,3], nums2 = [1,1,2,2]
     * 输出：[[3],[]]
     * 解释：
     * 对于 nums1 ，nums1[2] 和 nums1[3] 没有出现在 nums2 中。由于 nums1[2] == nums1[3] ，二者的值只需要在 answer[0] 中出现一次，故 answer[0] = [3]。
     * nums2 中的每个整数都在 nums1 中出现，因此，answer[1] = [] 。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        FindDifference findDifference = new FindDifference();
        int[] num1 = new int[]{1, 2, 3, 3};
        int[] num2 = new int[]{1, 1, 2, 2};
        System.out.println(findDifference.findDifference(num1, num2));
    }

    public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map1 = new HashMap<>();
        Arrays.stream(nums1).forEach(v -> {
            map1.put(v, map1.getOrDefault(v, 0) + 1);
        });
        Map<Integer, Integer> map2 = new HashMap<>();
        Arrays.stream(nums2).forEach(v -> {
            //特殊标记 如果value=0的时候 说明重复出现过
            if (Objects.nonNull(map1.get(v)) && map1.get(v) >= 0) {
                map1.put(v, 0);
            } else {
                map2.put(v, map2.getOrDefault(v, 0) + 1);
            }
        });
        List<List<Integer>> ans = new ArrayList<>();
        ans.add(map1.keySet().stream().filter(v -> map1.get(v) != 0).collect(Collectors.toList()));
        ans.add(new ArrayList<>(map2.keySet()));
        return ans;
    }

}
